package com.huo.com.redisLock.lock;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;

import java.util.Collections;

public class TestLock {

    private RedisTemplate<String,String> redisTemplate;

    public TestLock(RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    //获取锁
    public boolean getLock(String goodsId, String userId){

        //编写lua脚本  原子执行
        String getLock="if redis.call('setNx',KEYS[1],ARGV[1]) ==1 then return redis.call('expire',KEYS[1],ARGV[2]) else return 0 end";

        DefaultRedisScript<Long> defaultRedisScript=new DefaultRedisScript<>();
        defaultRedisScript.setResultType(Long.class);
        defaultRedisScript.setScriptText(getLock);

        //执行lua脚本
        Long execute = redisTemplate.execute(defaultRedisScript, Collections.singletonList(goodsId), userId, "50");

        if(execute==1){
          return true;
        }else{
          return false;
        }
    }

    //释放锁
    public boolean unLock(String goodsId,String userId){
        System.out.println("=============>>"+userId);
        String unlock="if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end";

        DefaultRedisScript<Long> defaultRedisScript=new DefaultRedisScript<>();
        defaultRedisScript.setResultType(Long.class);
        defaultRedisScript.setScriptText(unlock);

        Long execute = redisTemplate.execute(defaultRedisScript, Collections.singletonList(goodsId), userId);

        if(execute==1){
          return true;
        }else{
          return false;
        }

    }

}
